{
 "cells": [
  {
   "cell_type": "code",
   "execution_count": 1,
   "id": "a2ac12d6",
   "metadata": {},
   "outputs": [],
   "source": [
    "import numpy as np"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "id": "58317977",
   "metadata": {},
   "outputs": [],
   "source": [
    "np.set_printoptions(suppress=True)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "id": "94dcad65",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([[40920.  ,     8.33,     1.91,     0.  ],\n",
       "       [14488.  ,     7.15,     3.35,     1.  ],\n",
       "       [26052.  ,     1.44,     1.61,     2.  ],\n",
       "       ...,\n",
       "       [26575.  ,    10.65,     1.73,     0.  ],\n",
       "       [48111.  ,     9.13,     1.46,     0.  ],\n",
       "       [43757.  ,     7.88,     2.66,     0.  ]])"
      ]
     },
     "execution_count": 3,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "data = np.loadtxt('yuehui_test.csv', delimiter=',')\n",
    "data"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "id": "261d26bd",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([[40920.  ,     8.33,     1.91],\n",
       "       [35948.  ,     6.83,     2.43],\n",
       "       [42666.  ,    13.28,     1.09],\n",
       "       [35483.  ,    12.27,     3.02],\n",
       "       [28488.  ,    10.53,     2.61],\n",
       "       [28782.  ,     6.59,     0.37],\n",
       "       [36788.  ,    12.46,     1.3 ],\n",
       "       [28567.  ,     9.97,     1.46],\n",
       "       [36661.  ,    11.87,     1.77],\n",
       "       [15360.  ,     8.55,     2.68],\n",
       "       [14851.  ,    14.31,     1.26],\n",
       "       [33553.  ,    12.59,     1.37],\n",
       "       [27738.  ,     8.53,     0.41],\n",
       "       [29290.  ,     9.83,     0.48],\n",
       "       [42330.  ,    11.49,     0.53],\n",
       "       [41539.  ,    10.39,     3.33],\n",
       "       [18983.  ,    10.45,     0.54],\n",
       "       [ 9744.  ,    11.47,     1.52],\n",
       "       [39336.  ,    10.05,     2.28],\n",
       "       [27353.  ,    11.38,     3.06],\n",
       "       [25607.  ,     8.68,     0.17],\n",
       "       [46426.  ,     7.29,     1.1 ],\n",
       "       [32688.  ,     8.75,     1.71],\n",
       "       [28861.  ,    11.42,     3.01],\n",
       "       [32193.  ,    10.34,     1.17],\n",
       "       [41732.  ,     9.51,     0.01],\n",
       "       [11429.  ,     8.65,     2.7 ],\n",
       "       [40279.  ,     9.02,     3.32],\n",
       "       [21540.  ,     9.22,     1.61],\n",
       "       [42403.  ,    11.29,     0.42],\n",
       "       [28122.  ,     8.77,     2.22],\n",
       "       [34095.  ,    11.5 ,     1.09],\n",
       "       [40131.  ,    12.45,     0.6 ],\n",
       "       [13994.  ,    12.91,     3.32],\n",
       "       [ 6122.  ,     9.75,     2.36],\n",
       "       [28454.  ,    11.7 ,     1.36],\n",
       "       [39776.  ,     8.75,     0.97],\n",
       "       [40987.  ,    10.83,     3.17],\n",
       "       [38768.  ,     5.31,     0.06],\n",
       "       [26501.  ,    11.57,     2.12],\n",
       "       [37433.  ,     8.04,     2.17],\n",
       "       [23503.  ,    10.73,     0.21],\n",
       "       [27742.  ,     9.01,     1.1 ],\n",
       "       [32729.  ,     9.16,     3.25],\n",
       "       [42414.  ,    14.08,     1.39],\n",
       "       [20210.  ,    10.11,     2.62],\n",
       "       [33225.  ,     7.96,     2.44],\n",
       "       [18475.  ,    12.66,     1.19],\n",
       "       [26547.  ,     6.02,     0.97],\n",
       "       [44404.  ,     7.23,     2.51],\n",
       "       [ 8123.  ,    11.85,     2.19],\n",
       "       [42747.  ,    11.66,     2.34],\n",
       "       [18121.  ,     7.94,     1.81],\n",
       "       [28168.  ,    13.86,     2.59],\n",
       "       [40963.  ,    10.31,     2.42],\n",
       "       [31685.  ,     7.23,     1.34],\n",
       "       [51213.  ,     7.84,     2.12],\n",
       "       [ 4805.  ,    11.44,     3.11],\n",
       "       [30302.  ,     8.24,     2.25],\n",
       "       [37217.  ,     7.75,     1.74],\n",
       "       [19896.  ,    11.92,     0.05],\n",
       "       [32011.  ,    13.09,     0.95],\n",
       "       [27698.  ,    10.91,     1.24],\n",
       "       [56117.  ,    10.65,     1.96],\n",
       "       [26627.  ,     8.5 ,     1.66],\n",
       "       [22160.  ,    12.11,     0.72],\n",
       "       [22945.  ,     8.01,     3.36],\n",
       "       [34914.  ,    11.77,     2.53],\n",
       "       [35073.  ,     9.29,     1.53],\n",
       "       [16801.  ,     8.59,     2.91],\n",
       "       [44591.  ,    11.52,     0.6 ],\n",
       "       [50939.  ,    10.43,     2.25],\n",
       "       [32901.  ,    10.44,     1.95],\n",
       "       [42850.  ,    12.48,     3.26],\n",
       "       [54462.  ,    11.84,     1.39],\n",
       "       [20085.  ,    12.42,     2.85],\n",
       "       [42291.  ,    12.16,     0.14],\n",
       "       [47550.  ,     8.15,     3.3 ],\n",
       "       [48463.  ,    11.05,     0.28],\n",
       "       [32967.  ,    10.25,     0.39],\n",
       "       [42795.  ,     9.42,     0.03],\n",
       "       [ 5494.  ,     9.69,     2.06],\n",
       "       [25621.  ,    13.18,     0.55],\n",
       "       [27665.  ,    12.79,     2.61],\n",
       "       [21808.  ,    10.73,     1.18],\n",
       "       [20057.  ,     8.03,     3.24],\n",
       "       [35602.  ,    10.77,     1.34],\n",
       "       [21835.  ,    11.25,     2.95],\n",
       "       [26226.  ,     8.24,     0.56],\n",
       "       [19600.  ,    11.16,     0.67],\n",
       "       [37422.  ,    11.03,     1.01],\n",
       "       [44883.  ,    11.9 ,     0.81],\n",
       "       [40409.  ,    12.39,     3.14],\n",
       "       [26400.  ,    11.13,     1.2 ],\n",
       "       [13491.  ,     8.84,     0.7 ],\n",
       "       [30232.  ,    10.69,     2.91],\n",
       "       [43253.  ,     5.71,     3.35],\n",
       "       [25783.  ,     9.95,     2.58],\n",
       "       [31676.  ,    10.04,     1.92],\n",
       "       [44738.  ,    10.24,     1.27],\n",
       "       [29956.  ,    13.41,     3.28],\n",
       "       [23758.  ,     9.48,     1.8 ],\n",
       "       [23762.  ,    12.98,     1.01],\n",
       "       [25647.  ,    13.53,     3.17],\n",
       "       [49459.  ,     8.37,     1.31],\n",
       "       [31657.  ,    13.16,     0.29],\n",
       "       [33101.  ,     4.44,     0.88],\n",
       "       [27107.  ,     9.85,     1.29],\n",
       "       [43536.  ,     8.25,     1.5 ],\n",
       "       [35283.  ,     6.09,     3.39],\n",
       "       [31054.  ,    11.51,     3.25],\n",
       "       [52387.  ,     8.81,     1.43],\n",
       "       [34844.  ,     8.89,     3.33],\n",
       "       [32721.  ,     9.61,     0.13],\n",
       "       [37192.  ,    10.41,     1.78],\n",
       "       [28818.  ,     8.1 ,     0.43],\n",
       "       [40668.  ,    11.23,     0.82],\n",
       "       [39580.  ,     9.07,     0.02],\n",
       "       [56594.  ,     8.96,     2.39],\n",
       "       [45465.  ,     9.24,     0.38],\n",
       "       [31033.  ,    10.56,     0.81],\n",
       "       [26397.  ,    10.54,     3.28],\n",
       "       [31690.  ,     6.75,     1.78],\n",
       "       [31442.  ,    10.83,     1.12],\n",
       "       [31044.  ,    11.32,     0.54],\n",
       "       [29938.  ,    13.27,     1.27],\n",
       "       [51542.  ,     6.52,     0.81],\n",
       "       [29138.  ,     8.52,     1.49],\n",
       "       [25941.  ,     9.82,     0.73],\n",
       "       [31128.  ,    11.82,     0.39],\n",
       "       [52440.  ,    10.24,     0.56],\n",
       "       [56557.  ,    11.75,     3.39],\n",
       "       [42342.  ,     8.1 ,     2.65],\n",
       "       [15560.  ,    12.41,     1.58],\n",
       "       [34826.  ,    12.17,     2.66],\n",
       "       [21546.  ,    10.07,     1.58],\n",
       "       [36715.  ,     8.13,     0.66],\n",
       "       [26728.  ,    10.96,     2.07],\n",
       "       [34909.  ,     8.9 ,     2.07],\n",
       "       [42856.  ,     9.6 ,     1.24],\n",
       "       [41740.  ,     9.61,     2.88],\n",
       "       [30417.  ,     7.19,     2.98],\n",
       "       [36842.  ,     8.83,     1.79],\n",
       "       [39299.  ,     6.33,     1.21],\n",
       "       [33835.  ,     8.19,     1.93],\n",
       "       [32054.  ,     9.2 ,     2.28],\n",
       "       [38579.  ,    10.2 ,     0.9 ],\n",
       "       [26635.  ,     9.15,     2.1 ],\n",
       "       [37302.  ,    14.12,     1.35],\n",
       "       [22878.  ,     8.93,     1.89],\n",
       "       [17309.  ,     7.75,     1.11],\n",
       "       [42816.  ,    10.96,     2.96],\n",
       "       [43751.  ,    10.22,     0.98],\n",
       "       [42878.  ,    11.46,     2.96],\n",
       "       [42770.  ,    11.08,     0.18],\n",
       "       [31340.  ,     8.12,     2.57],\n",
       "       [41413.  ,     4.33,     1.51],\n",
       "       [22447.  ,     6.12,     1.4 ],\n",
       "       [33564.  ,     7.47,     1.01],\n",
       "       [48907.  ,     8.82,     1.3 ],\n",
       "       [46696.  ,    12.67,     1.86],\n",
       "       [36851.  ,     8.64,     0.8 ],\n",
       "       [26674.  ,    10.3 ,     2.99],\n",
       "       [25054.  ,     9.08,     3.21],\n",
       "       [33085.  ,    14.16,     1.12],\n",
       "       [41379.  ,     9.08,     1.98],\n",
       "       [39417.  ,     6.52,     0.08],\n",
       "       [46321.  ,    13.11,     2.56],\n",
       "       [27884.  ,     8.86,     1.14],\n",
       "       [39296.  ,     9.92,     0.18],\n",
       "       [46813.  ,    11.43,     0.64],\n",
       "       [44183.  ,     9.6 ,     0.45],\n",
       "       [29066.  ,    11.58,     0.92],\n",
       "       [26866.  ,    12.82,     1.78],\n",
       "       [32932.  ,     8.51,     3.04],\n",
       "       [51967.  ,    10.43,     2.38],\n",
       "       [44432.  ,     8.35,     0.08],\n",
       "       [31390.  ,    11.05,     2.36],\n",
       "       [33484.  ,    11.52,     0.  ],\n",
       "       [45944.  ,     9.21,     1.6 ],\n",
       "       [27862.  ,    12.64,     3.38],\n",
       "       [27940.  ,     8.  ,     1.67],\n",
       "       [37072.  ,    13.25,     1.85],\n",
       "       [25577.  ,    11.67,     1.77],\n",
       "       [29016.  ,    10.74,     1.94],\n",
       "       [21910.  ,    12.33,     3.19],\n",
       "       [36759.  ,    10.86,     2.31],\n",
       "       [30817.  ,    14.18,     1.23],\n",
       "       [47324.  ,    11.43,     1.65],\n",
       "       [45617.  ,    11.46,     3.08],\n",
       "       [28221.  ,    11.62,     2.21],\n",
       "       [18289.  ,     7.98,     1.86],\n",
       "       [23535.  ,    10.05,     0.78],\n",
       "       [32256.  ,    11.78,     3.02],\n",
       "       [38953.  ,    11.11,     0.4 ],\n",
       "       [25847.  ,     9.71,     2.02],\n",
       "       [32680.  ,    10.58,     1.67],\n",
       "       [33004.  ,    12.82,     1.35],\n",
       "       [32565.  ,     8.35,     0.51],\n",
       "       [28631.  ,     7.66,     0.11],\n",
       "       [39075.  ,    14.68,     1.59],\n",
       "       [35665.  ,    12.47,     0.33],\n",
       "       [41892.  ,    10.51,     3.02],\n",
       "       [32027.  ,    10.1 ,     2.38],\n",
       "       [50283.  ,     7.14,     1.77],\n",
       "       [33536.  ,    11.38,     2.88],\n",
       "       [37457.  ,    11.72,     0.6 ],\n",
       "       [17724.  ,     6.37,     2.95],\n",
       "       [43869.  ,     5.75,     0.4 ],\n",
       "       [25736.  ,     8.34,     1.27],\n",
       "       [39584.  ,     9.71,     3.01],\n",
       "       [49567.  ,     9.79,     1.97],\n",
       "       [35493.  ,     9.24,     0.99],\n",
       "       [37166.  ,     9.61,     0.29],\n",
       "       [30354.  ,    12.32,     0.39],\n",
       "       [33481.  ,     8.82,     2.39],\n",
       "       [43075.  ,    10.09,     1.14],\n",
       "       [38343.  ,     7.24,     3.32],\n",
       "       [37894.  ,    10.47,     3.19],\n",
       "       [36172.  ,     9.95,     0.01],\n",
       "       [35681.  ,     9.78,     1.07],\n",
       "       [49901.  ,     8.33,     3.29],\n",
       "       [49112.  ,     7.04,     2.42],\n",
       "       [40625.  ,    10.  ,     0.46],\n",
       "       [28580.  ,    10.68,     2.86],\n",
       "       [33944.  ,    10.61,     2.51],\n",
       "       [36768.  ,    10.26,     1.97],\n",
       "       [43231.  ,     9.85,     3.04],\n",
       "       [41081.  ,    10.41,     1.33],\n",
       "       [31600.  ,    10.36,     3.09],\n",
       "       [42181.  ,     6.8 ,     2.22],\n",
       "       [30832.  ,    12.55,     2.8 ],\n",
       "       [41571.  ,    11.64,     0.88],\n",
       "       [39808.  ,    10.84,     1.67],\n",
       "       [22146.  ,    14.94,     1.78],\n",
       "       [29241.  ,     7.79,     2.22],\n",
       "       [26241.  ,     9.82,     2.69],\n",
       "       [32174.  ,     6.78,     1.77],\n",
       "       [45043.  ,     8.21,     3.1 ],\n",
       "       [42173.  ,    10.08,     2.75],\n",
       "       [46979.  ,     6.73,     2.14],\n",
       "       [32907.  ,     7.07,     2.23],\n",
       "       [37444.  ,     9.12,     2.64],\n",
       "       [26166.  ,     7.28,     0.98],\n",
       "       [41544.  ,     8.78,     2.22],\n",
       "       [22272.  ,     7.52,     3.25],\n",
       "       [31369.  ,    11.74,     0.05],\n",
       "       [37760.  ,    12.31,     0.52],\n",
       "       [52555.  ,    10.81,     1.22],\n",
       "       [38997.  ,    12.17,     1.69],\n",
       "       [47636.  ,    10.06,     1.78],\n",
       "       [33057.  ,     7.82,     0.95],\n",
       "       [28681.  ,    12.28,     0.15],\n",
       "       [34042.  ,    10.06,     2.23],\n",
       "       [33957.  ,     8.48,     1.04],\n",
       "       [36094.  ,     9.68,     1.56],\n",
       "       [39835.  ,    10.62,     2.72],\n",
       "       [38183.  ,    13.37,     0.43],\n",
       "       [37045.  ,     8.  ,     3.16],\n",
       "       [28152.  ,    14.15,     3.18],\n",
       "       [25931.  ,     8.77,     0.31],\n",
       "       [25374.  ,    10.25,     2.9 ],\n",
       "       [38324.  ,     7.49,     3.14],\n",
       "       [44058.  ,     9.  ,     2.87],\n",
       "       [41316.  ,    11.56,     0.01],\n",
       "       [35695.  ,    10.3 ,     3.15],\n",
       "       [47744.  ,     8.25,     1.42],\n",
       "       [39512.  ,     9.85,     2.19],\n",
       "       [17585.  ,    11.18,     2.58],\n",
       "       [31662.  ,    13.95,     2.85],\n",
       "       [43214.  ,    12.48,     1.38],\n",
       "       [52544.  ,    10.07,     1.53],\n",
       "       [37190.  ,    12.93,     0.61],\n",
       "       [27223.  ,     8.36,     3.29],\n",
       "       [30254.  ,    11.59,     0.57],\n",
       "       [21704.  ,    10.1 ,     1.41],\n",
       "       [34985.  ,     9.3 ,     1.09],\n",
       "       [31316.  ,    11.16,     0.44],\n",
       "       [27953.  ,    10.97,     2.44],\n",
       "       [35255.  ,    10.64,     0.83],\n",
       "       [19198.  ,     9.63,     1.97],\n",
       "       [39710.  ,    10.37,     1.01],\n",
       "       [55635.  ,     8.52,     1.99],\n",
       "       [53447.  ,     7.3 ,     3.16],\n",
       "       [33682.  ,     7.73,     1.84],\n",
       "       [26080.  ,    11.32,     3.02],\n",
       "       [30902.  ,     7.35,     0.05],\n",
       "       [35262.  ,    10.12,     2.31],\n",
       "       [42776.  ,    11.31,     0.17],\n",
       "       [38334.  ,     9.36,     0.1 ],\n",
       "       [34068.  ,    10.05,     1.1 ],\n",
       "       [30819.  ,    11.11,     1.98],\n",
       "       [22239.  ,    11.27,     1.45],\n",
       "       [28725.  ,    10.38,     0.51],\n",
       "       [28294.  ,    10.53,     1.56],\n",
       "       [22240.  ,    10.17,     3.32],\n",
       "       [35570.  ,    14.61,     2.49],\n",
       "       [50908.  ,    15.11,     2.65],\n",
       "       [39891.  ,     5.18,     0.45],\n",
       "       [36669.  ,    11.06,     0.76],\n",
       "       [38876.  ,     8.83,     2.  ],\n",
       "       [26878.  ,    11.17,     2.96],\n",
       "       [46246.  ,    11.51,     0.84],\n",
       "       [12761.  ,     7.8 ,     0.3 ],\n",
       "       [35282.  ,    10.16,     2.74],\n",
       "       [31262.  ,     9.66,     3.04],\n",
       "       [34754.  ,    10.79,     2.63],\n",
       "       [30365.  ,     9.83,     2.78],\n",
       "       [24332.  ,    11.12,     1.62],\n",
       "       [45517.  ,    13.4 ,     1.32],\n",
       "       [53644.  ,     7.97,     0.61],\n",
       "       [51417.  ,     9.08,     1.47],\n",
       "       [27276.  ,     5.19,     2.19],\n",
       "       [30453.  ,    10.34,     2.18],\n",
       "       [10591.  ,    10.23,     1.61],\n",
       "       [33114.  ,     9.49,     1.66],\n",
       "       [35018.  ,     9.96,     0.12],\n",
       "       [35015.  ,     9.95,     3.3 ],\n",
       "       [40999.  ,     9.16,     2.22],\n",
       "       [35432.  ,     7.4 ,     1.37],\n",
       "       [53711.  ,    12.15,     2.78],\n",
       "       [22845.  ,    14.72,     3.01],\n",
       "       [34143.  ,    13.61,     0.73],\n",
       "       [27750.  ,     8.55,     0.26],\n",
       "       [26575.  ,    10.65,     1.73],\n",
       "       [48111.  ,     9.13,     1.46],\n",
       "       [43757.  ,     7.88,     2.66]])"
      ]
     },
     "execution_count": 4,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "# 拆分featrue和label\n",
    "feature = data[:, :3]\n",
    "label = data[:,-1]\n",
    "\n",
    "# 0 非常喜欢，1 还可以，0 不喜欢\n",
    "mask_verylike = data[:, -1] == 0\n",
    "mask_littlelike = data[:, -1] == 1\n",
    "mask_dislike = data[:, -1] == 2\n",
    "# mask_verylike\n",
    "feature[mask_verylike]"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 5,
   "id": "9670c321",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "<Figure size 640x640 with 0 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "import matplotlib.pyplot as plt\n",
    "\n",
    "fig = plt.figure(figsize=(8, 8), dpi=80)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 6,
   "id": "46428bd5",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "# 淘宝一年消费额作为x, 玩游戏的时间作为y\n",
    "plt.scatter(feature[mask_verylike][:,0], feature[mask_verylike][:,1], c='r', marker='o', label='very_like')\n",
    "plt.scatter(feature[mask_littlelike][:,0], feature[mask_littlelike][:,1], c='b', marker='x', label='little_like')\n",
    "plt.scatter(feature[mask_dislike][:,0], feature[mask_dislike][:,1], c='g', marker='*', label='dislike')\n",
    "\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "13b0ed85",
   "metadata": {},
   "source": [
    "### 三维的散点图"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 29,
   "id": "a62cb381",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "application/javascript": [
       "/* Put everything inside the global mpl namespace */\n",
       "/* global mpl */\n",
       "window.mpl = {};\n",
       "\n",
       "mpl.get_websocket_type = function () {\n",
       "    if (typeof WebSocket !== 'undefined') {\n",
       "        return WebSocket;\n",
       "    } else if (typeof MozWebSocket !== 'undefined') {\n",
       "        return MozWebSocket;\n",
       "    } else {\n",
       "        alert(\n",
       "            'Your browser does not have WebSocket support. ' +\n",
       "                'Please try Chrome, Safari or Firefox ≥ 6. ' +\n",
       "                'Firefox 4 and 5 are also supported but you ' +\n",
       "                'have to enable WebSockets in about:config.'\n",
       "        );\n",
       "    }\n",
       "};\n",
       "\n",
       "mpl.figure = function (figure_id, websocket, ondownload, parent_element) {\n",
       "    this.id = figure_id;\n",
       "\n",
       "    this.ws = websocket;\n",
       "\n",
       "    this.supports_binary = this.ws.binaryType !== undefined;\n",
       "\n",
       "    if (!this.supports_binary) {\n",
       "        var warnings = document.getElementById('mpl-warnings');\n",
       "        if (warnings) {\n",
       "            warnings.style.display = 'block';\n",
       "            warnings.textContent =\n",
       "                'This browser does not support binary websocket messages. ' +\n",
       "                'Performance may be slow.';\n",
       "        }\n",
       "    }\n",
       "\n",
       "    this.imageObj = new Image();\n",
       "\n",
       "    this.context = undefined;\n",
       "    this.message = undefined;\n",
       "    this.canvas = undefined;\n",
       "    this.rubberband_canvas = undefined;\n",
       "    this.rubberband_context = undefined;\n",
       "    this.format_dropdown = undefined;\n",
       "\n",
       "    this.image_mode = 'full';\n",
       "\n",
       "    this.root = document.createElement('div');\n",
       "    this.root.setAttribute('style', 'display: inline-block');\n",
       "    this._root_extra_style(this.root);\n",
       "\n",
       "    parent_element.appendChild(this.root);\n",
       "\n",
       "    this._init_header(this);\n",
       "    this._init_canvas(this);\n",
       "    this._init_toolbar(this);\n",
       "\n",
       "    var fig = this;\n",
       "\n",
       "    this.waiting = false;\n",
       "\n",
       "    this.ws.onopen = function () {\n",
       "        fig.send_message('supports_binary', { value: fig.supports_binary });\n",
       "        fig.send_message('send_image_mode', {});\n",
       "        if (fig.ratio !== 1) {\n",
       "            fig.send_message('set_dpi_ratio', { dpi_ratio: fig.ratio });\n",
       "        }\n",
       "        fig.send_message('refresh', {});\n",
       "    };\n",
       "\n",
       "    this.imageObj.onload = function () {\n",
       "        if (fig.image_mode === 'full') {\n",
       "            // Full images could contain transparency (where diff images\n",
       "            // almost always do), so we need to clear the canvas so that\n",
       "            // there is no ghosting.\n",
       "            fig.context.clearRect(0, 0, fig.canvas.width, fig.canvas.height);\n",
       "        }\n",
       "        fig.context.drawImage(fig.imageObj, 0, 0);\n",
       "    };\n",
       "\n",
       "    this.imageObj.onunload = function () {\n",
       "        fig.ws.close();\n",
       "    };\n",
       "\n",
       "    this.ws.onmessage = this._make_on_message_function(this);\n",
       "\n",
       "    this.ondownload = ondownload;\n",
       "};\n",
       "\n",
       "mpl.figure.prototype._init_header = function () {\n",
       "    var titlebar = document.createElement('div');\n",
       "    titlebar.classList =\n",
       "        'ui-dialog-titlebar ui-widget-header ui-corner-all ui-helper-clearfix';\n",
       "    var titletext = document.createElement('div');\n",
       "    titletext.classList = 'ui-dialog-title';\n",
       "    titletext.setAttribute(\n",
       "        'style',\n",
       "        'width: 100%; text-align: center; padding: 3px;'\n",
       "    );\n",
       "    titlebar.appendChild(titletext);\n",
       "    this.root.appendChild(titlebar);\n",
       "    this.header = titletext;\n",
       "};\n",
       "\n",
       "mpl.figure.prototype._canvas_extra_style = function (_canvas_div) {};\n",
       "\n",
       "mpl.figure.prototype._root_extra_style = function (_canvas_div) {};\n",
       "\n",
       "mpl.figure.prototype._init_canvas = function () {\n",
       "    var fig = this;\n",
       "\n",
       "    var canvas_div = (this.canvas_div = document.createElement('div'));\n",
       "    canvas_div.setAttribute(\n",
       "        'style',\n",
       "        'border: 1px solid #ddd;' +\n",
       "            'box-sizing: content-box;' +\n",
       "            'clear: both;' +\n",
       "            'min-height: 1px;' +\n",
       "            'min-width: 1px;' +\n",
       "            'outline: 0;' +\n",
       "            'overflow: hidden;' +\n",
       "            'position: relative;' +\n",
       "            'resize: both;'\n",
       "    );\n",
       "\n",
       "    function on_keyboard_event_closure(name) {\n",
       "        return function (event) {\n",
       "            return fig.key_event(event, name);\n",
       "        };\n",
       "    }\n",
       "\n",
       "    canvas_div.addEventListener(\n",
       "        'keydown',\n",
       "        on_keyboard_event_closure('key_press')\n",
       "    );\n",
       "    canvas_div.addEventListener(\n",
       "        'keyup',\n",
       "        on_keyboard_event_closure('key_release')\n",
       "    );\n",
       "\n",
       "    this._canvas_extra_style(canvas_div);\n",
       "    this.root.appendChild(canvas_div);\n",
       "\n",
       "    var canvas = (this.canvas = document.createElement('canvas'));\n",
       "    canvas.classList.add('mpl-canvas');\n",
       "    canvas.setAttribute('style', 'box-sizing: content-box;');\n",
       "\n",
       "    this.context = canvas.getContext('2d');\n",
       "\n",
       "    var backingStore =\n",
       "        this.context.backingStorePixelRatio ||\n",
       "        this.context.webkitBackingStorePixelRatio ||\n",
       "        this.context.mozBackingStorePixelRatio ||\n",
       "        this.context.msBackingStorePixelRatio ||\n",
       "        this.context.oBackingStorePixelRatio ||\n",
       "        this.context.backingStorePixelRatio ||\n",
       "        1;\n",
       "\n",
       "    this.ratio = (window.devicePixelRatio || 1) / backingStore;\n",
       "    if (this.ratio !== 1) {\n",
       "        fig.send_message('set_dpi_ratio', { dpi_ratio: this.ratio });\n",
       "    }\n",
       "\n",
       "    var rubberband_canvas = (this.rubberband_canvas = document.createElement(\n",
       "        'canvas'\n",
       "    ));\n",
       "    rubberband_canvas.setAttribute(\n",
       "        'style',\n",
       "        'box-sizing: content-box; position: absolute; left: 0; top: 0; z-index: 1;'\n",
       "    );\n",
       "\n",
       "    // Apply a ponyfill if ResizeObserver is not implemented by browser.\n",
       "    if (this.ResizeObserver === undefined) {\n",
       "        if (window.ResizeObserver !== undefined) {\n",
       "            this.ResizeObserver = window.ResizeObserver;\n",
       "        } else {\n",
       "            var obs = _JSXTOOLS_RESIZE_OBSERVER({});\n",
       "            this.ResizeObserver = obs.ResizeObserver;\n",
       "        }\n",
       "    }\n",
       "\n",
       "    this.resizeObserverInstance = new this.ResizeObserver(function (entries) {\n",
       "        var nentries = entries.length;\n",
       "        for (var i = 0; i < nentries; i++) {\n",
       "            var entry = entries[i];\n",
       "            var width, height;\n",
       "            if (entry.contentBoxSize) {\n",
       "                if (entry.contentBoxSize instanceof Array) {\n",
       "                    // Chrome 84 implements new version of spec.\n",
       "                    width = entry.contentBoxSize[0].inlineSize;\n",
       "                    height = entry.contentBoxSize[0].blockSize;\n",
       "                } else {\n",
       "                    // Firefox implements old version of spec.\n",
       "                    width = entry.contentBoxSize.inlineSize;\n",
       "                    height = entry.contentBoxSize.blockSize;\n",
       "                }\n",
       "            } else {\n",
       "                // Chrome <84 implements even older version of spec.\n",
       "                width = entry.contentRect.width;\n",
       "                height = entry.contentRect.height;\n",
       "            }\n",
       "\n",
       "            // Keep the size of the canvas and rubber band canvas in sync with\n",
       "            // the canvas container.\n",
       "            if (entry.devicePixelContentBoxSize) {\n",
       "                // Chrome 84 implements new version of spec.\n",
       "                canvas.setAttribute(\n",
       "                    'width',\n",
       "                    entry.devicePixelContentBoxSize[0].inlineSize\n",
       "                );\n",
       "                canvas.setAttribute(\n",
       "                    'height',\n",
       "                    entry.devicePixelContentBoxSize[0].blockSize\n",
       "                );\n",
       "            } else {\n",
       "                canvas.setAttribute('width', width * fig.ratio);\n",
       "                canvas.setAttribute('height', height * fig.ratio);\n",
       "            }\n",
       "            canvas.setAttribute(\n",
       "                'style',\n",
       "                'width: ' + width + 'px; height: ' + height + 'px;'\n",
       "            );\n",
       "\n",
       "            rubberband_canvas.setAttribute('width', width);\n",
       "            rubberband_canvas.setAttribute('height', height);\n",
       "\n",
       "            // And update the size in Python. We ignore the initial 0/0 size\n",
       "            // that occurs as the element is placed into the DOM, which should\n",
       "            // otherwise not happen due to the minimum size styling.\n",
       "            if (width != 0 && height != 0) {\n",
       "                fig.request_resize(width, height);\n",
       "            }\n",
       "        }\n",
       "    });\n",
       "    this.resizeObserverInstance.observe(canvas_div);\n",
       "\n",
       "    function on_mouse_event_closure(name) {\n",
       "        return function (event) {\n",
       "            return fig.mouse_event(event, name);\n",
       "        };\n",
       "    }\n",
       "\n",
       "    rubberband_canvas.addEventListener(\n",
       "        'mousedown',\n",
       "        on_mouse_event_closure('button_press')\n",
       "    );\n",
       "    rubberband_canvas.addEventListener(\n",
       "        'mouseup',\n",
       "        on_mouse_event_closure('button_release')\n",
       "    );\n",
       "    // Throttle sequential mouse events to 1 every 20ms.\n",
       "    rubberband_canvas.addEventListener(\n",
       "        'mousemove',\n",
       "        on_mouse_event_closure('motion_notify')\n",
       "    );\n",
       "\n",
       "    rubberband_canvas.addEventListener(\n",
       "        'mouseenter',\n",
       "        on_mouse_event_closure('figure_enter')\n",
       "    );\n",
       "    rubberband_canvas.addEventListener(\n",
       "        'mouseleave',\n",
       "        on_mouse_event_closure('figure_leave')\n",
       "    );\n",
       "\n",
       "    canvas_div.addEventListener('wheel', function (event) {\n",
       "        if (event.deltaY < 0) {\n",
       "            event.step = 1;\n",
       "        } else {\n",
       "            event.step = -1;\n",
       "        }\n",
       "        on_mouse_event_closure('scroll')(event);\n",
       "    });\n",
       "\n",
       "    canvas_div.appendChild(canvas);\n",
       "    canvas_div.appendChild(rubberband_canvas);\n",
       "\n",
       "    this.rubberband_context = rubberband_canvas.getContext('2d');\n",
       "    this.rubberband_context.strokeStyle = '#000000';\n",
       "\n",
       "    this._resize_canvas = function (width, height, forward) {\n",
       "        if (forward) {\n",
       "            canvas_div.style.width = width + 'px';\n",
       "            canvas_div.style.height = height + 'px';\n",
       "        }\n",
       "    };\n",
       "\n",
       "    // Disable right mouse context menu.\n",
       "    this.rubberband_canvas.addEventListener('contextmenu', function (_e) {\n",
       "        event.preventDefault();\n",
       "        return false;\n",
       "    });\n",
       "\n",
       "    function set_focus() {\n",
       "        canvas.focus();\n",
       "        canvas_div.focus();\n",
       "    }\n",
       "\n",
       "    window.setTimeout(set_focus, 100);\n",
       "};\n",
       "\n",
       "mpl.figure.prototype._init_toolbar = function () {\n",
       "    var fig = this;\n",
       "\n",
       "    var toolbar = document.createElement('div');\n",
       "    toolbar.classList = 'mpl-toolbar';\n",
       "    this.root.appendChild(toolbar);\n",
       "\n",
       "    function on_click_closure(name) {\n",
       "        return function (_event) {\n",
       "            return fig.toolbar_button_onclick(name);\n",
       "        };\n",
       "    }\n",
       "\n",
       "    function on_mouseover_closure(tooltip) {\n",
       "        return function (event) {\n",
       "            if (!event.currentTarget.disabled) {\n",
       "                return fig.toolbar_button_onmouseover(tooltip);\n",
       "            }\n",
       "        };\n",
       "    }\n",
       "\n",
       "    fig.buttons = {};\n",
       "    var buttonGroup = document.createElement('div');\n",
       "    buttonGroup.classList = 'mpl-button-group';\n",
       "    for (var toolbar_ind in mpl.toolbar_items) {\n",
       "        var name = mpl.toolbar_items[toolbar_ind][0];\n",
       "        var tooltip = mpl.toolbar_items[toolbar_ind][1];\n",
       "        var image = mpl.toolbar_items[toolbar_ind][2];\n",
       "        var method_name = mpl.toolbar_items[toolbar_ind][3];\n",
       "\n",
       "        if (!name) {\n",
       "            /* Instead of a spacer, we start a new button group. */\n",
       "            if (buttonGroup.hasChildNodes()) {\n",
       "                toolbar.appendChild(buttonGroup);\n",
       "            }\n",
       "            buttonGroup = document.createElement('div');\n",
       "            buttonGroup.classList = 'mpl-button-group';\n",
       "            continue;\n",
       "        }\n",
       "\n",
       "        var button = (fig.buttons[name] = document.createElement('button'));\n",
       "        button.classList = 'mpl-widget';\n",
       "        button.setAttribute('role', 'button');\n",
       "        button.setAttribute('aria-disabled', 'false');\n",
       "        button.addEventListener('click', on_click_closure(method_name));\n",
       "        button.addEventListener('mouseover', on_mouseover_closure(tooltip));\n",
       "\n",
       "        var icon_img = document.createElement('img');\n",
       "        icon_img.src = '_images/' + image + '.png';\n",
       "        icon_img.srcset = '_images/' + image + '_large.png 2x';\n",
       "        icon_img.alt = tooltip;\n",
       "        button.appendChild(icon_img);\n",
       "\n",
       "        buttonGroup.appendChild(button);\n",
       "    }\n",
       "\n",
       "    if (buttonGroup.hasChildNodes()) {\n",
       "        toolbar.appendChild(buttonGroup);\n",
       "    }\n",
       "\n",
       "    var fmt_picker = document.createElement('select');\n",
       "    fmt_picker.classList = 'mpl-widget';\n",
       "    toolbar.appendChild(fmt_picker);\n",
       "    this.format_dropdown = fmt_picker;\n",
       "\n",
       "    for (var ind in mpl.extensions) {\n",
       "        var fmt = mpl.extensions[ind];\n",
       "        var option = document.createElement('option');\n",
       "        option.selected = fmt === mpl.default_extension;\n",
       "        option.innerHTML = fmt;\n",
       "        fmt_picker.appendChild(option);\n",
       "    }\n",
       "\n",
       "    var status_bar = document.createElement('span');\n",
       "    status_bar.classList = 'mpl-message';\n",
       "    toolbar.appendChild(status_bar);\n",
       "    this.message = status_bar;\n",
       "};\n",
       "\n",
       "mpl.figure.prototype.request_resize = function (x_pixels, y_pixels) {\n",
       "    // Request matplotlib to resize the figure. Matplotlib will then trigger a resize in the client,\n",
       "    // which will in turn request a refresh of the image.\n",
       "    this.send_message('resize', { width: x_pixels, height: y_pixels });\n",
       "};\n",
       "\n",
       "mpl.figure.prototype.send_message = function (type, properties) {\n",
       "    properties['type'] = type;\n",
       "    properties['figure_id'] = this.id;\n",
       "    this.ws.send(JSON.stringify(properties));\n",
       "};\n",
       "\n",
       "mpl.figure.prototype.send_draw_message = function () {\n",
       "    if (!this.waiting) {\n",
       "        this.waiting = true;\n",
       "        this.ws.send(JSON.stringify({ type: 'draw', figure_id: this.id }));\n",
       "    }\n",
       "};\n",
       "\n",
       "mpl.figure.prototype.handle_save = function (fig, _msg) {\n",
       "    var format_dropdown = fig.format_dropdown;\n",
       "    var format = format_dropdown.options[format_dropdown.selectedIndex].value;\n",
       "    fig.ondownload(fig, format);\n",
       "};\n",
       "\n",
       "mpl.figure.prototype.handle_resize = function (fig, msg) {\n",
       "    var size = msg['size'];\n",
       "    if (size[0] !== fig.canvas.width || size[1] !== fig.canvas.height) {\n",
       "        fig._resize_canvas(size[0], size[1], msg['forward']);\n",
       "        fig.send_message('refresh', {});\n",
       "    }\n",
       "};\n",
       "\n",
       "mpl.figure.prototype.handle_rubberband = function (fig, msg) {\n",
       "    var x0 = msg['x0'] / fig.ratio;\n",
       "    var y0 = (fig.canvas.height - msg['y0']) / fig.ratio;\n",
       "    var x1 = msg['x1'] / fig.ratio;\n",
       "    var y1 = (fig.canvas.height - msg['y1']) / fig.ratio;\n",
       "    x0 = Math.floor(x0) + 0.5;\n",
       "    y0 = Math.floor(y0) + 0.5;\n",
       "    x1 = Math.floor(x1) + 0.5;\n",
       "    y1 = Math.floor(y1) + 0.5;\n",
       "    var min_x = Math.min(x0, x1);\n",
       "    var min_y = Math.min(y0, y1);\n",
       "    var width = Math.abs(x1 - x0);\n",
       "    var height = Math.abs(y1 - y0);\n",
       "\n",
       "    fig.rubberband_context.clearRect(\n",
       "        0,\n",
       "        0,\n",
       "        fig.canvas.width / fig.ratio,\n",
       "        fig.canvas.height / fig.ratio\n",
       "    );\n",
       "\n",
       "    fig.rubberband_context.strokeRect(min_x, min_y, width, height);\n",
       "};\n",
       "\n",
       "mpl.figure.prototype.handle_figure_label = function (fig, msg) {\n",
       "    // Updates the figure title.\n",
       "    fig.header.textContent = msg['label'];\n",
       "};\n",
       "\n",
       "mpl.figure.prototype.handle_cursor = function (fig, msg) {\n",
       "    var cursor = msg['cursor'];\n",
       "    switch (cursor) {\n",
       "        case 0:\n",
       "            cursor = 'pointer';\n",
       "            break;\n",
       "        case 1:\n",
       "            cursor = 'default';\n",
       "            break;\n",
       "        case 2:\n",
       "            cursor = 'crosshair';\n",
       "            break;\n",
       "        case 3:\n",
       "            cursor = 'move';\n",
       "            break;\n",
       "    }\n",
       "    fig.rubberband_canvas.style.cursor = cursor;\n",
       "};\n",
       "\n",
       "mpl.figure.prototype.handle_message = function (fig, msg) {\n",
       "    fig.message.textContent = msg['message'];\n",
       "};\n",
       "\n",
       "mpl.figure.prototype.handle_draw = function (fig, _msg) {\n",
       "    // Request the server to send over a new figure.\n",
       "    fig.send_draw_message();\n",
       "};\n",
       "\n",
       "mpl.figure.prototype.handle_image_mode = function (fig, msg) {\n",
       "    fig.image_mode = msg['mode'];\n",
       "};\n",
       "\n",
       "mpl.figure.prototype.handle_history_buttons = function (fig, msg) {\n",
       "    for (var key in msg) {\n",
       "        if (!(key in fig.buttons)) {\n",
       "            continue;\n",
       "        }\n",
       "        fig.buttons[key].disabled = !msg[key];\n",
       "        fig.buttons[key].setAttribute('aria-disabled', !msg[key]);\n",
       "    }\n",
       "};\n",
       "\n",
       "mpl.figure.prototype.handle_navigate_mode = function (fig, msg) {\n",
       "    if (msg['mode'] === 'PAN') {\n",
       "        fig.buttons['Pan'].classList.add('active');\n",
       "        fig.buttons['Zoom'].classList.remove('active');\n",
       "    } else if (msg['mode'] === 'ZOOM') {\n",
       "        fig.buttons['Pan'].classList.remove('active');\n",
       "        fig.buttons['Zoom'].classList.add('active');\n",
       "    } else {\n",
       "        fig.buttons['Pan'].classList.remove('active');\n",
       "        fig.buttons['Zoom'].classList.remove('active');\n",
       "    }\n",
       "};\n",
       "\n",
       "mpl.figure.prototype.updated_canvas_event = function () {\n",
       "    // Called whenever the canvas gets updated.\n",
       "    this.send_message('ack', {});\n",
       "};\n",
       "\n",
       "// A function to construct a web socket function for onmessage handling.\n",
       "// Called in the figure constructor.\n",
       "mpl.figure.prototype._make_on_message_function = function (fig) {\n",
       "    return function socket_on_message(evt) {\n",
       "        if (evt.data instanceof Blob) {\n",
       "            /* FIXME: We get \"Resource interpreted as Image but\n",
       "             * transferred with MIME type text/plain:\" errors on\n",
       "             * Chrome.  But how to set the MIME type?  It doesn't seem\n",
       "             * to be part of the websocket stream */\n",
       "            evt.data.type = 'image/png';\n",
       "\n",
       "            /* Free the memory for the previous frames */\n",
       "            if (fig.imageObj.src) {\n",
       "                (window.URL || window.webkitURL).revokeObjectURL(\n",
       "                    fig.imageObj.src\n",
       "                );\n",
       "            }\n",
       "\n",
       "            fig.imageObj.src = (window.URL || window.webkitURL).createObjectURL(\n",
       "                evt.data\n",
       "            );\n",
       "            fig.updated_canvas_event();\n",
       "            fig.waiting = false;\n",
       "            return;\n",
       "        } else if (\n",
       "            typeof evt.data === 'string' &&\n",
       "            evt.data.slice(0, 21) === 'data:image/png;base64'\n",
       "        ) {\n",
       "            fig.imageObj.src = evt.data;\n",
       "            fig.updated_canvas_event();\n",
       "            fig.waiting = false;\n",
       "            return;\n",
       "        }\n",
       "\n",
       "        var msg = JSON.parse(evt.data);\n",
       "        var msg_type = msg['type'];\n",
       "\n",
       "        // Call the  \"handle_{type}\" callback, which takes\n",
       "        // the figure and JSON message as its only arguments.\n",
       "        try {\n",
       "            var callback = fig['handle_' + msg_type];\n",
       "        } catch (e) {\n",
       "            console.log(\n",
       "                \"No handler for the '\" + msg_type + \"' message type: \",\n",
       "                msg\n",
       "            );\n",
       "            return;\n",
       "        }\n",
       "\n",
       "        if (callback) {\n",
       "            try {\n",
       "                // console.log(\"Handling '\" + msg_type + \"' message: \", msg);\n",
       "                callback(fig, msg);\n",
       "            } catch (e) {\n",
       "                console.log(\n",
       "                    \"Exception inside the 'handler_\" + msg_type + \"' callback:\",\n",
       "                    e,\n",
       "                    e.stack,\n",
       "                    msg\n",
       "                );\n",
       "            }\n",
       "        }\n",
       "    };\n",
       "};\n",
       "\n",
       "// from http://stackoverflow.com/questions/1114465/getting-mouse-location-in-canvas\n",
       "mpl.findpos = function (e) {\n",
       "    //this section is from http://www.quirksmode.org/js/events_properties.html\n",
       "    var targ;\n",
       "    if (!e) {\n",
       "        e = window.event;\n",
       "    }\n",
       "    if (e.target) {\n",
       "        targ = e.target;\n",
       "    } else if (e.srcElement) {\n",
       "        targ = e.srcElement;\n",
       "    }\n",
       "    if (targ.nodeType === 3) {\n",
       "        // defeat Safari bug\n",
       "        targ = targ.parentNode;\n",
       "    }\n",
       "\n",
       "    // pageX,Y are the mouse positions relative to the document\n",
       "    var boundingRect = targ.getBoundingClientRect();\n",
       "    var x = e.pageX - (boundingRect.left + document.body.scrollLeft);\n",
       "    var y = e.pageY - (boundingRect.top + document.body.scrollTop);\n",
       "\n",
       "    return { x: x, y: y };\n",
       "};\n",
       "\n",
       "/*\n",
       " * return a copy of an object with only non-object keys\n",
       " * we need this to avoid circular references\n",
       " * http://stackoverflow.com/a/24161582/3208463\n",
       " */\n",
       "function simpleKeys(original) {\n",
       "    return Object.keys(original).reduce(function (obj, key) {\n",
       "        if (typeof original[key] !== 'object') {\n",
       "            obj[key] = original[key];\n",
       "        }\n",
       "        return obj;\n",
       "    }, {});\n",
       "}\n",
       "\n",
       "mpl.figure.prototype.mouse_event = function (event, name) {\n",
       "    var canvas_pos = mpl.findpos(event);\n",
       "\n",
       "    if (name === 'button_press') {\n",
       "        this.canvas.focus();\n",
       "        this.canvas_div.focus();\n",
       "    }\n",
       "\n",
       "    var x = canvas_pos.x * this.ratio;\n",
       "    var y = canvas_pos.y * this.ratio;\n",
       "\n",
       "    this.send_message(name, {\n",
       "        x: x,\n",
       "        y: y,\n",
       "        button: event.button,\n",
       "        step: event.step,\n",
       "        guiEvent: simpleKeys(event),\n",
       "    });\n",
       "\n",
       "    /* This prevents the web browser from automatically changing to\n",
       "     * the text insertion cursor when the button is pressed.  We want\n",
       "     * to control all of the cursor setting manually through the\n",
       "     * 'cursor' event from matplotlib */\n",
       "    event.preventDefault();\n",
       "    return false;\n",
       "};\n",
       "\n",
       "mpl.figure.prototype._key_event_extra = function (_event, _name) {\n",
       "    // Handle any extra behaviour associated with a key event\n",
       "};\n",
       "\n",
       "mpl.figure.prototype.key_event = function (event, name) {\n",
       "    // Prevent repeat events\n",
       "    if (name === 'key_press') {\n",
       "        if (event.which === this._key) {\n",
       "            return;\n",
       "        } else {\n",
       "            this._key = event.which;\n",
       "        }\n",
       "    }\n",
       "    if (name === 'key_release') {\n",
       "        this._key = null;\n",
       "    }\n",
       "\n",
       "    var value = '';\n",
       "    if (event.ctrlKey && event.which !== 17) {\n",
       "        value += 'ctrl+';\n",
       "    }\n",
       "    if (event.altKey && event.which !== 18) {\n",
       "        value += 'alt+';\n",
       "    }\n",
       "    if (event.shiftKey && event.which !== 16) {\n",
       "        value += 'shift+';\n",
       "    }\n",
       "\n",
       "    value += 'k';\n",
       "    value += event.which.toString();\n",
       "\n",
       "    this._key_event_extra(event, name);\n",
       "\n",
       "    this.send_message(name, { key: value, guiEvent: simpleKeys(event) });\n",
       "    return false;\n",
       "};\n",
       "\n",
       "mpl.figure.prototype.toolbar_button_onclick = function (name) {\n",
       "    if (name === 'download') {\n",
       "        this.handle_save(this, null);\n",
       "    } else {\n",
       "        this.send_message('toolbar_button', { name: name });\n",
       "    }\n",
       "};\n",
       "\n",
       "mpl.figure.prototype.toolbar_button_onmouseover = function (tooltip) {\n",
       "    this.message.textContent = tooltip;\n",
       "};\n",
       "\n",
       "///////////////// REMAINING CONTENT GENERATED BY embed_js.py /////////////////\n",
       "// prettier-ignore\n",
       "var _JSXTOOLS_RESIZE_OBSERVER=function(A){var t,i=new WeakMap,n=new WeakMap,a=new WeakMap,r=new WeakMap,o=new Set;function s(e){if(!(this instanceof s))throw new TypeError(\"Constructor requires 'new' operator\");i.set(this,e)}function h(){throw new TypeError(\"Function is not a constructor\")}function c(e,t,i,n){e=0 in arguments?Number(arguments[0]):0,t=1 in arguments?Number(arguments[1]):0,i=2 in arguments?Number(arguments[2]):0,n=3 in arguments?Number(arguments[3]):0,this.right=(this.x=this.left=e)+(this.width=i),this.bottom=(this.y=this.top=t)+(this.height=n),Object.freeze(this)}function d(){t=requestAnimationFrame(d);var s=new WeakMap,p=new Set;o.forEach((function(t){r.get(t).forEach((function(i){var r=t instanceof window.SVGElement,o=a.get(t),d=r?0:parseFloat(o.paddingTop),f=r?0:parseFloat(o.paddingRight),l=r?0:parseFloat(o.paddingBottom),u=r?0:parseFloat(o.paddingLeft),g=r?0:parseFloat(o.borderTopWidth),m=r?0:parseFloat(o.borderRightWidth),w=r?0:parseFloat(o.borderBottomWidth),b=u+f,F=d+l,v=(r?0:parseFloat(o.borderLeftWidth))+m,W=g+w,y=r?0:t.offsetHeight-W-t.clientHeight,E=r?0:t.offsetWidth-v-t.clientWidth,R=b+v,z=F+W,M=r?t.width:parseFloat(o.width)-R-E,O=r?t.height:parseFloat(o.height)-z-y;if(n.has(t)){var k=n.get(t);if(k[0]===M&&k[1]===O)return}n.set(t,[M,O]);var S=Object.create(h.prototype);S.target=t,S.contentRect=new c(u,d,M,O),s.has(i)||(s.set(i,[]),p.add(i)),s.get(i).push(S)}))})),p.forEach((function(e){i.get(e).call(e,s.get(e),e)}))}return s.prototype.observe=function(i){if(i instanceof window.Element){r.has(i)||(r.set(i,new Set),o.add(i),a.set(i,window.getComputedStyle(i)));var n=r.get(i);n.has(this)||n.add(this),cancelAnimationFrame(t),t=requestAnimationFrame(d)}},s.prototype.unobserve=function(i){if(i instanceof window.Element&&r.has(i)){var n=r.get(i);n.has(this)&&(n.delete(this),n.size||(r.delete(i),o.delete(i))),n.size||r.delete(i),o.size||cancelAnimationFrame(t)}},A.DOMRectReadOnly=c,A.ResizeObserver=s,A.ResizeObserverEntry=h,A}; // eslint-disable-line\n",
       "mpl.toolbar_items = [[\"Home\", \"Reset original view\", \"fa fa-home icon-home\", \"home\"], [\"Back\", \"Back to previous view\", \"fa fa-arrow-left icon-arrow-left\", \"back\"], [\"Forward\", \"Forward to next view\", \"fa fa-arrow-right icon-arrow-right\", \"forward\"], [\"\", \"\", \"\", \"\"], [\"Pan\", \"Left button pans, Right button zooms\\nx/y fixes axis, CTRL fixes aspect\", \"fa fa-arrows icon-move\", \"pan\"], [\"Zoom\", \"Zoom to rectangle\\nx/y fixes axis, CTRL fixes aspect\", \"fa fa-square-o icon-check-empty\", \"zoom\"], [\"\", \"\", \"\", \"\"], [\"Download\", \"Download plot\", \"fa fa-floppy-o icon-save\", \"download\"]];\n",
       "\n",
       "mpl.extensions = [\"eps\", \"jpeg\", \"pdf\", \"png\", \"ps\", \"raw\", \"svg\", \"tif\"];\n",
       "\n",
       "mpl.default_extension = \"png\";/* global mpl */\n",
       "\n",
       "var comm_websocket_adapter = function (comm) {\n",
       "    // Create a \"websocket\"-like object which calls the given IPython comm\n",
       "    // object with the appropriate methods. Currently this is a non binary\n",
       "    // socket, so there is still some room for performance tuning.\n",
       "    var ws = {};\n",
       "\n",
       "    ws.close = function () {\n",
       "        comm.close();\n",
       "    };\n",
       "    ws.send = function (m) {\n",
       "        //console.log('sending', m);\n",
       "        comm.send(m);\n",
       "    };\n",
       "    // Register the callback with on_msg.\n",
       "    comm.on_msg(function (msg) {\n",
       "        //console.log('receiving', msg['content']['data'], msg);\n",
       "        // Pass the mpl event to the overridden (by mpl) onmessage function.\n",
       "        ws.onmessage(msg['content']['data']);\n",
       "    });\n",
       "    return ws;\n",
       "};\n",
       "\n",
       "mpl.mpl_figure_comm = function (comm, msg) {\n",
       "    // This is the function which gets called when the mpl process\n",
       "    // starts-up an IPython Comm through the \"matplotlib\" channel.\n",
       "\n",
       "    var id = msg.content.data.id;\n",
       "    // Get hold of the div created by the display call when the Comm\n",
       "    // socket was opened in Python.\n",
       "    var element = document.getElementById(id);\n",
       "    var ws_proxy = comm_websocket_adapter(comm);\n",
       "\n",
       "    function ondownload(figure, _format) {\n",
       "        window.open(figure.canvas.toDataURL());\n",
       "    }\n",
       "\n",
       "    var fig = new mpl.figure(id, ws_proxy, ondownload, element);\n",
       "\n",
       "    // Call onopen now - mpl needs it, as it is assuming we've passed it a real\n",
       "    // web socket which is closed, not our websocket->open comm proxy.\n",
       "    ws_proxy.onopen();\n",
       "\n",
       "    fig.parent_element = element;\n",
       "    fig.cell_info = mpl.find_output_cell(\"<div id='\" + id + \"'></div>\");\n",
       "    if (!fig.cell_info) {\n",
       "        console.error('Failed to find cell for figure', id, fig);\n",
       "        return;\n",
       "    }\n",
       "    fig.cell_info[0].output_area.element.on(\n",
       "        'cleared',\n",
       "        { fig: fig },\n",
       "        fig._remove_fig_handler\n",
       "    );\n",
       "};\n",
       "\n",
       "mpl.figure.prototype.handle_close = function (fig, msg) {\n",
       "    var width = fig.canvas.width / fig.ratio;\n",
       "    fig.cell_info[0].output_area.element.off(\n",
       "        'cleared',\n",
       "        fig._remove_fig_handler\n",
       "    );\n",
       "    fig.resizeObserverInstance.unobserve(fig.canvas_div);\n",
       "\n",
       "    // Update the output cell to use the data from the current canvas.\n",
       "    fig.push_to_output();\n",
       "    var dataURL = fig.canvas.toDataURL();\n",
       "    // Re-enable the keyboard manager in IPython - without this line, in FF,\n",
       "    // the notebook keyboard shortcuts fail.\n",
       "    IPython.keyboard_manager.enable();\n",
       "    fig.parent_element.innerHTML =\n",
       "        '<img src=\"' + dataURL + '\" width=\"' + width + '\">';\n",
       "    fig.close_ws(fig, msg);\n",
       "};\n",
       "\n",
       "mpl.figure.prototype.close_ws = function (fig, msg) {\n",
       "    fig.send_message('closing', msg);\n",
       "    // fig.ws.close()\n",
       "};\n",
       "\n",
       "mpl.figure.prototype.push_to_output = function (_remove_interactive) {\n",
       "    // Turn the data on the canvas into data in the output cell.\n",
       "    var width = this.canvas.width / this.ratio;\n",
       "    var dataURL = this.canvas.toDataURL();\n",
       "    this.cell_info[1]['text/html'] =\n",
       "        '<img src=\"' + dataURL + '\" width=\"' + width + '\">';\n",
       "};\n",
       "\n",
       "mpl.figure.prototype.updated_canvas_event = function () {\n",
       "    // Tell IPython that the notebook contents must change.\n",
       "    IPython.notebook.set_dirty(true);\n",
       "    this.send_message('ack', {});\n",
       "    var fig = this;\n",
       "    // Wait a second, then push the new image to the DOM so\n",
       "    // that it is saved nicely (might be nice to debounce this).\n",
       "    setTimeout(function () {\n",
       "        fig.push_to_output();\n",
       "    }, 1000);\n",
       "};\n",
       "\n",
       "mpl.figure.prototype._init_toolbar = function () {\n",
       "    var fig = this;\n",
       "\n",
       "    var toolbar = document.createElement('div');\n",
       "    toolbar.classList = 'btn-toolbar';\n",
       "    this.root.appendChild(toolbar);\n",
       "\n",
       "    function on_click_closure(name) {\n",
       "        return function (_event) {\n",
       "            return fig.toolbar_button_onclick(name);\n",
       "        };\n",
       "    }\n",
       "\n",
       "    function on_mouseover_closure(tooltip) {\n",
       "        return function (event) {\n",
       "            if (!event.currentTarget.disabled) {\n",
       "                return fig.toolbar_button_onmouseover(tooltip);\n",
       "            }\n",
       "        };\n",
       "    }\n",
       "\n",
       "    fig.buttons = {};\n",
       "    var buttonGroup = document.createElement('div');\n",
       "    buttonGroup.classList = 'btn-group';\n",
       "    var button;\n",
       "    for (var toolbar_ind in mpl.toolbar_items) {\n",
       "        var name = mpl.toolbar_items[toolbar_ind][0];\n",
       "        var tooltip = mpl.toolbar_items[toolbar_ind][1];\n",
       "        var image = mpl.toolbar_items[toolbar_ind][2];\n",
       "        var method_name = mpl.toolbar_items[toolbar_ind][3];\n",
       "\n",
       "        if (!name) {\n",
       "            /* Instead of a spacer, we start a new button group. */\n",
       "            if (buttonGroup.hasChildNodes()) {\n",
       "                toolbar.appendChild(buttonGroup);\n",
       "            }\n",
       "            buttonGroup = document.createElement('div');\n",
       "            buttonGroup.classList = 'btn-group';\n",
       "            continue;\n",
       "        }\n",
       "\n",
       "        button = fig.buttons[name] = document.createElement('button');\n",
       "        button.classList = 'btn btn-default';\n",
       "        button.href = '#';\n",
       "        button.title = name;\n",
       "        button.innerHTML = '<i class=\"fa ' + image + ' fa-lg\"></i>';\n",
       "        button.addEventListener('click', on_click_closure(method_name));\n",
       "        button.addEventListener('mouseover', on_mouseover_closure(tooltip));\n",
       "        buttonGroup.appendChild(button);\n",
       "    }\n",
       "\n",
       "    if (buttonGroup.hasChildNodes()) {\n",
       "        toolbar.appendChild(buttonGroup);\n",
       "    }\n",
       "\n",
       "    // Add the status bar.\n",
       "    var status_bar = document.createElement('span');\n",
       "    status_bar.classList = 'mpl-message pull-right';\n",
       "    toolbar.appendChild(status_bar);\n",
       "    this.message = status_bar;\n",
       "\n",
       "    // Add the close button to the window.\n",
       "    var buttongrp = document.createElement('div');\n",
       "    buttongrp.classList = 'btn-group inline pull-right';\n",
       "    button = document.createElement('button');\n",
       "    button.classList = 'btn btn-mini btn-primary';\n",
       "    button.href = '#';\n",
       "    button.title = 'Stop Interaction';\n",
       "    button.innerHTML = '<i class=\"fa fa-power-off icon-remove icon-large\"></i>';\n",
       "    button.addEventListener('click', function (_evt) {\n",
       "        fig.handle_close(fig, {});\n",
       "    });\n",
       "    button.addEventListener(\n",
       "        'mouseover',\n",
       "        on_mouseover_closure('Stop Interaction')\n",
       "    );\n",
       "    buttongrp.appendChild(button);\n",
       "    var titlebar = this.root.querySelector('.ui-dialog-titlebar');\n",
       "    titlebar.insertBefore(buttongrp, titlebar.firstChild);\n",
       "};\n",
       "\n",
       "mpl.figure.prototype._remove_fig_handler = function (event) {\n",
       "    var fig = event.data.fig;\n",
       "    if (event.target !== this) {\n",
       "        // Ignore bubbled events from children.\n",
       "        return;\n",
       "    }\n",
       "    fig.close_ws(fig, {});\n",
       "};\n",
       "\n",
       "mpl.figure.prototype._root_extra_style = function (el) {\n",
       "    el.style.boxSizing = 'content-box'; // override notebook setting of border-box.\n",
       "};\n",
       "\n",
       "mpl.figure.prototype._canvas_extra_style = function (el) {\n",
       "    // this is important to make the div 'focusable\n",
       "    el.setAttribute('tabindex', 0);\n",
       "    // reach out to IPython and tell the keyboard manager to turn it's self\n",
       "    // off when our div gets focus\n",
       "\n",
       "    // location in version 3\n",
       "    if (IPython.notebook.keyboard_manager) {\n",
       "        IPython.notebook.keyboard_manager.register_events(el);\n",
       "    } else {\n",
       "        // location in version 2\n",
       "        IPython.keyboard_manager.register_events(el);\n",
       "    }\n",
       "};\n",
       "\n",
       "mpl.figure.prototype._key_event_extra = function (event, _name) {\n",
       "    var manager = IPython.notebook.keyboard_manager;\n",
       "    if (!manager) {\n",
       "        manager = IPython.keyboard_manager;\n",
       "    }\n",
       "\n",
       "    // Check for shift+enter\n",
       "    if (event.shiftKey && event.which === 13) {\n",
       "        this.canvas_div.blur();\n",
       "        // select the cell after this one\n",
       "        var index = IPython.notebook.find_cell_index(this.cell_info[0]);\n",
       "        IPython.notebook.select(index + 1);\n",
       "    }\n",
       "};\n",
       "\n",
       "mpl.figure.prototype.handle_save = function (fig, _msg) {\n",
       "    fig.ondownload(fig, null);\n",
       "};\n",
       "\n",
       "mpl.find_output_cell = function (html_output) {\n",
       "    // Return the cell and output element which can be found *uniquely* in the notebook.\n",
       "    // Note - this is a bit hacky, but it is done because the \"notebook_saving.Notebook\"\n",
       "    // IPython event is triggered only after the cells have been serialised, which for\n",
       "    // our purposes (turning an active figure into a static one), is too late.\n",
       "    var cells = IPython.notebook.get_cells();\n",
       "    var ncells = cells.length;\n",
       "    for (var i = 0; i < ncells; i++) {\n",
       "        var cell = cells[i];\n",
       "        if (cell.cell_type === 'code') {\n",
       "            for (var j = 0; j < cell.output_area.outputs.length; j++) {\n",
       "                var data = cell.output_area.outputs[j];\n",
       "                if (data.data) {\n",
       "                    // IPython >= 3 moved mimebundle to data attribute of output\n",
       "                    data = data.data;\n",
       "                }\n",
       "                if (data['text/html'] === html_output) {\n",
       "                    return [cell, data, j];\n",
       "                }\n",
       "            }\n",
       "        }\n",
       "    }\n",
       "};\n",
       "\n",
       "// Register the function which deals with the matplotlib target/channel.\n",
       "// The kernel may be null if the page has been refreshed.\n",
       "if (IPython.notebook.kernel !== null) {\n",
       "    IPython.notebook.kernel.comm_manager.register_target(\n",
       "        'matplotlib',\n",
       "        mpl.mpl_figure_comm\n",
       "    );\n",
       "}\n"
      ],
      "text/plain": [
       "<IPython.core.display.Javascript object>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "data": {
      "text/html": [
       "<img src=\"\" width=\"640\">"
      ],
      "text/plain": [
       "<IPython.core.display.HTML object>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "from mpl_toolkits.mplot3d import Axes3D\n",
    "%matplotlib notebook\n",
    "\n",
    "import matplotlib.pyplot as plt2\n",
    "\n",
    "fig2 = plt2.figure(figsize=(8, 8), dpi=80)\n",
    "ax = Axes3D(fig2)\n",
    "\n",
    "# 数据标准化\n",
    "def std(input):\n",
    "    return (input - np.mean(input.T, axis=1)) / np.std(input.T, axis=1)\n",
    "\n",
    "feature = std(feature)\n",
    "\n",
    "ax.scatter(feature[mask_verylike][:,0], feature[mask_verylike][:,1],feature[mask_verylike][:,2], \n",
    "            c='r', label='very_like')\n",
    "ax.scatter(feature[mask_littlelike][:,0], feature[mask_littlelike][:,1],feature[mask_littlelike][:,2], \n",
    "            c='b', label='little_like')\n",
    "ax.scatter(feature[mask_dislike][:,0], feature[mask_dislike][:,1],feature[mask_dislike][:,2], \n",
    "            c='g', label='dislike')\n",
    "\n",
    "plt2.show()\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 25,
   "id": "7ea0c54e",
   "metadata": {},
   "outputs": [],
   "source": []
  },
  {
   "cell_type": "code",
   "execution_count": 28,
   "id": "da201e62",
   "metadata": {},
   "outputs": [],
   "source": [
    "# from ipywidgets import interact\n",
    "# x = np.linspace(0, 10, 100)\n",
    "# y = 2 * x + 3\n",
    "# plt.xlim(0, 10)\n",
    "# plt.xlim(0, 30)\n",
    "# plt.plot(x, y)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 27,
   "id": "88534f55",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "[<mpl_toolkits.mplot3d.art3d.Line3D at 0x7f55317e23d0>]"
      ]
     },
     "execution_count": 27,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": []
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.8.8"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 5
}
